<?php

require_once( "classes/orm/Property.php" );

/**
 * Хранимый объект
 * 
 * @author alno
 */
class StoredObject {
	
	/**
	 * Идентификатор объекта
	 */
	var $id;
	
	/**
	 * Имя таблицы для хранения объекта
	 */
	var $table;
	
	/**
	 * Ссылка на хранилище
	 */
	var $storage;
	
	/**
	 * Карта свойств объекта
	 */
	var $properties = array();
	
	/**
	 * Карта отношений объекта
	 */
	var $relations = array();
	
	/**
	 * Добавить свойство в объект
	 *
	 * @param String $name имя свойства
	 * @param unknown_type $type тип свойства
	 */
	function addProperty( $name, $type ) {
		$this->properties[$name] = new Property( $name, $type );
	}
	
	/**
	 * Добавить отношение в объект
	 *
	 * @param String $name имя отношения
	 * @param unknown_type $relation объект отношения
	 */
	function addRelation( $name, $relation ) {
		$this->relations[$name] = $relation;
	}
	
	/**
	 * Получить идентификатор объекта
	 *
	 * @return unknown идентификатор
	 */
	function getId() {
		return $this->id;
	}
	
	/**
	 * Получить свойство или отношение объекта
	 *
	 * @param String $name имя
	 */
	function get( $name ) {
		if ( $name == "id" ) {
			return $this->id;
		} else if ( isset( $this->properties[$name] ) ) {
			return $this->properties[$name]->get();
		} else if ( isset( $this->relations[$name] ) ) {
			return $this->relations[$name]->get();
		}
	}	
	
	/**
	 * Установить свойство объекта
	 *
	 * @param unknown_type $fieldName имя свойства
	 * @param unknown_type $value значение свойства
	 */
	function set( $fieldName, $value ) {
		if ( isset( $this->properties[$fieldName] ) ) {
			return $this->properties[$fieldName]->set( $value );
		}
	}

	/**
	 * Загрузить объект из карты свойств
	 *
	 * @param array $data карта свойств
	 */
	function mergeFromArray( $data ) {
		foreach( $this->properties as $propname => $propvalue ) if ( isset( $data[ $propname ] ) ) {
			$this->set( $propname, $data[ $propname ] );
		}
	}
}

?>